package com.yuan.gather.entity;

import com.fasterxml.jackson.annotation.JsonInclude;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Mapping;
import org.springframework.data.elasticsearch.annotations.Setting;

import javax.persistence.Id;
import javax.persistence.Transient;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * 基线检查巡检资源信息日志。
 *
 * @author zhaoff
 */
@Document(indexName = "st-gather")
@Mapping(mappingPath = "/com/yuan/gather/entity/gather-asset-dev.json")
@Setting(settingPath = "/com/yuan/gather/gather-settings.json")
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class GatherAssetLog implements Serializable {

    private static final long serialVersionUID = -219982949322231361L;

    /**
     * 数据收集结果：2 部分成功
     */
    public static final Integer RESULT_PORTION = 2;

    /**
     * 数据收集结果：1 失败
     */
    public static final Integer RESULT_FAIL = 1;

    /**
     * 数据收集结果：0 成功
     */
    public static final Integer RESULT_SUCCESS = 0;

    /**
     * 采集类型：0 不常变化项
     */
    public static final String GATHER_ITEM_TYPE_ACTIVE = "0";

    /**
     * 采集类型：1 耗时项
     */
    public static final String GATHER_ITEM_TYPE_PASSIVE = "1";

    /**
     * 采集类型：2 实时项
     */
    public static final String GATHER_ITEM_TYPE_REALTIME = "2";

    /**
     * 资产状态： 0 - 未开始
     */
    public static final Integer STATE_UNSTART = 0;

    /**
     * 资产状态： 1 -  排队中，已放入线程池等待队列，尚未执行
     */
    public static final Integer STATE_QUEUED = 1;

    /**
     * 资产状态： 2 - 正在执行
     */
    public static final Integer STATE_RUNNING = 2;

    /**
     * 资产状态： 3 - 执行结束
     */
    public static final Integer STATE_END = 3;

    /**
     * 资产状态：4 - 执行暂停
     */
    public static final Integer STATE_STOP = 4;

    /**
     * 资产采集日志属性，计划ID
     */
    public static final String PLAN_ID = "planId";

    /**
     * 资产采集日志属性，计划子任务ID
     */
    public static final String TASK_LOG_ID = "taskLogId";

    /**
     * 资产采集日志属性，是否使用agent
     */
    public static final String USE_AGENT = "useAgent";

    /**
     * 资产采集日志属性，开始时间
     */
    public static final String BEGIN_TIME = "begin";

    /**
     * 资产采集日志属性，结束时间
     */
    public static final String END_TIME = "end";

    /**
     * 资产采集日志属性，采集ID
     */
    public static final String GATHER_ID = "gatherId";

    /**
     * 资产采集日志属性，采集资产IP
     */
    public static final String IP = "ip";

    /**
     * 资产采集日志属性，采集结果
     */
    public static final String RESULT = "result";

    /**
     * 资产采集日志属性，采集状态
     */
    public static final String STATE = "state";

    /**
     * 资产采集日志属性，失败原因
     */
    public static final String FAIL_REASON = "reason";

    /**
     * 资产采集暂停
     */
    public static final String STATE_UPDATE_STOP = "stop";

    /**
     * 资产采集继续
     */
    public static final String STATE_UPDATE_CONTINUE = "continue";

    /**
     * 日志ID，String型
     */
    @Id
    private String id;

    /**
     * 采集ID
     */
    private String gatherId;

    /**
     * 采集任务-子任务日志ID
     */
    private String taskLogId;

    /**
     * 任务名称
     */
    private String planName;

    /**
     * 任务ID
     */
    private Long planId;

    /**
     * 设备id
     */
    private Long devId;

    /**
     * 执行开始时间
     */
    private Long begin;

    /**
     * 执行结束时间
     */
    private Long end;

    /**
     * 任务创建时间，尚未执行
     */
    private Long create;

    /**
     * 执行结果状态，0 成功,1 失败,2 部分成功
     */
    private Integer result;

    /**
     * 失败原因
     */
    private String reason;

    /**
     * 采集项数目
     */
    private Integer size = 0;

    /**
     * 异常数
     */
    private Integer abnormalSize;

    /**
     * 资产名称
     */
    private String devName;

    /**
     * 设备ip
     */
    private String ip;

    /**
     * 单个数据采集项
     */
    private CopyOnWriteArrayList<GatherItemLog> itemlogs = new CopyOnWriteArrayList<>();

    /**
     * 类型 0-主机 1-网络 2-数据库 3-应用系统 5-安全 6-中间件
     */
    @Transient
    private int type;

    /**
     * 任务类型
     */
    private String taskType;

    /**
     * 资产版本
     */
    private String version;

    /**
     * 是否使用agent采集
     */
    private boolean useAgent;

    /**
     * 任务执行状态
     */
    private Integer state = STATE_UNSTART;

    /**
     * 本次采集的采集项key列表
     */
    private Set<String> itemKeys = new HashSet<>();

    /**
     * 增加检查项日志
     *
     * @param itemlog 检查项
     * @return GatherDevLog
     */
    public GatherAssetLog addItemLog(GatherItemLog itemlog) {
        itemlogs.add(itemlog);
        return this;
    }

}
